package 变长滑动窗口1

func totalFruit(fruits []int) (ans int) {
	diff := map[int]int{}
	left := 0
	for right, fruit := range fruits {
		diff[fruit]++
		for len(diff) > 2 {
			leftFruit := fruits[left] // 获取左指针当前指向的水果
			diff[leftFruit]--         // 减少计数
			if diff[leftFruit] == 0 { // 计数为0时，从map中删除该水果
				delete(diff, leftFruit)
			}
			left++
		}
		ans = max(ans, right-left+1)
	}
	return
}

//func totalFruit(fruits []int) (ans int) {
//    // 哈希表：记录当前窗口内水果的种类和数量（key=水果类型，value=出现次数）
//    cnt := map[int]int{}
//    left := 0 // 左指针，标记窗口左边界
//
//    // 右指针遍历所有果树，扩展窗口右边界
//    for right, fruit := range fruits {
//        // 1. 水果进入窗口：当前水果（fruits[right]）加入计数
//        cnt[fruit]++ // 出现次数+1
//
//        // 2. 检查窗口是否合法：如果水果种类超过2种，需要收缩左边界
//        for len(cnt) > 2 {
//            // 获取当前左边界的水果（即将被移出窗口的水果）
//            outFruit := fruits[left]
//            // 减少该水果的计数（因为左指针右移后，该水果不再属于窗口）
//            cnt[outFruit]--
//
//            // 如果该水果的计数变为0，说明窗口内已没有这种水果，从哈希表中删除
//            // 这一步很关键！避免哈希表中残留无效的0计数，导致len(cnt)计算错误
//            if cnt[outFruit] == 0 {
//                delete(cnt, outFruit)
//            }
//
//            // 左指针右移，缩小窗口
//            left++
//        }
//
//        // 3. 更新最大长度：当前窗口长度为 [left, right] 的元素个数（right-left+1）
//        // 每次窗口调整后（扩展或收缩），都可能产生新的最大值
//        if right-left+1 > ans {
//            ans = right - left + 1
//        }
//    }
//
//    return ans
//}
//
//// 辅助函数：返回两个整数中的较大值（Go语言无内置int类型的max函数）
//func max(a, b int) int {
//    if a > b {
//        return a
//    }
//    return b
//}3w
